const db = require('../models/db')
const moment = require('moment')
const replyControllers = require('./reply');
const likeControllers = require('./like')
const {imgPath} = require('../public/js/common')

//根据话题id获取评论,并且多表联合查询，找到该评论者的昵称,头像
//根据评论id获取回复,给每一个评论添加reply属性，储存回复内容(这里是异步过程)
//当前的登录用户是谁？他想看哪篇贴子的评论？需要记录不同用户在查看这条评论的时候的like情况
//需要去查likes表，如果是游客身份(7号用户都是false,直接以他作为游客身份,前端处理)查看可以看到点赞数量，但是都是显示未点赞的状态
//新增用户之后需要去likes给每一个评论设置默认值
exports.list =async (req,res,next)=>{
  try{
    //当前的登录用户是谁？他想看哪篇贴子的评论？
    const {article_id,user_id = 7} = req.query;
    const sqlStr = `
      SELECT c.id,      
             c.content,
             c.article_id,
             c.user_id,
             u.nickname AS user_nickname,
             u.avatar,
             c.alreadyLike,
             c.likeNum,
             l.isLike,
             DATE_FORMAT(c.create_time,'%Y-%m-%d %H:%i:%S') AS create_time
      FROM comments AS c
      INNER JOIN users AS u ON c.user_id = u.id AND c.article_id=${article_id}
      INNER JOIN likes AS l ON l.comment_id = c.id AND l.user_id = ${user_id}
      `;
    const comment = await db.query(sqlStr);
    //这里涉及到forEach的async/await,改成了for..of
    //replyControllers.list(item.id,next)还需要传入next,否则list函数中的catch无法调用next捕获错误
    for (const item of comment) {
      item.avatar = imgPath + item.avatar;         //拼接图片地址
      item.alreadyLike = item.alreadyLike === 1;   //曾经是否被人点过赞 1为true 0为false
      item.isLike = item.isLike === 1;             //是否被当前用户点过赞 1为true 0为false
      item.reply = await replyControllers.list(item.id,next)  //根据comment的id查找回复
    }
    res.status(201).json(comment)
  }catch (err) {
    next(err)
  }
};

//新增评论
exports.create =async (req,res,next)=>{
    try{
      const {content='',article_id} = req.body;
      console.log(content);
      console.log(article_id);
      //通过moment获取创建时间
      const create_time = moment().format("YYYY-MM-D HH:mm:ss");

      console.log('创造时间:',create_time);
      //通过moment获取修改时间
      const modify_time = moment().format("YYYY-MM-D HH:mm:ss");

      console.log('修改时间:',modify_time);

      const sqlStr =
          `INSERT INTO comments(content,create_time,modify_time,article_id,user_id)
           VALUES('${content}',
                  '${create_time}',
                  '${modify_time}',
                   ${article_id},
                   ${req.session.sessionUser.id})`;
      const {insertId} = await db.query(sqlStr);
      const [comment] = await db.query(`SELECT * FROM comments WHERE id=${insertId} `);
      comment.create_time = moment(comment.create_time).format("YYYY-MM-D HH:mm:ss");
      comment.modify_time = moment(comment.modify_time).format("YYYY-MM-D HH:mm:ss");

      //拿到新添加的父评论的id,以及所属话题的article_id,去初始化所有用户对新评论的点赞情况
      await likeControllers.create(comment.article_id,comment.id, next);


      res.status(201).json(comment)
    }catch (err) {
      next(err)
    }
};

//处理评论的点赞次数
exports.update =async (req,res,next)=>{
  try{
    const {id} = req.params;
    const {likeNum} = req.body;
    const sqlStr =
        ` UPDATE comments 
          SET likeNum=${likeNum}
          WHERE id=${id}`;
    await db.query(sqlStr);
    const comment = await db.query(`SELECT * FROM comments WHERE id=${id}`)
    res.status(201).json(comment)
  }catch (err) {
    
  }
};
exports.destroy =async (req,res,next)=>{
  try {
    //这里其实还有1种情况需要判断
    //判断当前资源是否存在,这个已经被抽取成为了中间件了

    //获取请求体,拿到当前需要被删除的话题的id
    const {id} = req.params;

    //根据当前id去删除对应的话题
    const sqlStr =
        `DELETE FROM comments 
         where id=${id}`;
    //执行sql语句
    const result = await db.query(sqlStr);
    console.log(result)
    //删除成功之后，返回空对象
    res.status(201).json({})
  } catch (err) {
    next(err)
  }
};